'''
- 在 QLabel 中使用 QPixmap 渲染静态图片，通过切换 QPixmap 实现动画效果
- 利用 QTimer 可以实现各种定时任务，例如定期走动，待机时展示动作等
    需要一个定期刷新图片的定时器，刷新图片时，根据当前宠物状态决定如何刷新。
    一个定期改变宠物状态的定时器

规定宠物的动作：
 站立
 走路

class Pet {
    init(): 标签设置、属性设置、各种定时器的设置等
    movation(): 宠物行为设置
    load_frames(path): 加载当前宠物的所有图像资源

    walk(direction, duration): 往左或往右走几秒
    crawl(direction, duration): 往左或右爬几秒
    sit(duration): 坐几秒
    sleep(duration): 睡几秒
    random_move(dir_x, dir_y, speed): 随机方向飞行
    random_act(act): 随机一套动作
    copy(): 影分身之术

}

'''
import random
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QSystemTrayIcon, QMenu, QAction
from PyQt5.QtCore import Qt, QTimer, QPoint
from PyQt5.QtGui import QPixmap, QIcon

class Pet(QWidget):
    def __init__(self):
        super().__init__()
        self.init_window()

        # 记录所有动画帧的路径
        self.pet_images = ["resources/walk_1.png", "resources/walk_2.png", "resources/sit.png", "resources/sleep.png"]
        self.current_frame = 2 # 一开始是sit的状态
        self.pet_status = 0 # 它必须是一个枚举类型，枚举所有的宠物状态

        # 使用QLabel存放宠物图片
        self.pet_label = QLabel(self)
        self.update_pet_image()

        # 定期刷新图片的定时器
        self.refresh_timer = QTimer()
        self.refresh_timer.timeout.connect(self.refresh)
        self.refresh_timer.start(200)

        # 定期更新宠物状态的定时器
        self.pet_status_timer = QTimer()
        self.pet_status_timer.timeout.connect(self.update_pet_status)
        self.pet_status_timer.start(500)

        # 实现鼠标拖拽
        self.drag_position = QPoint()

        # 托盘菜单
        self.create_tray_icon()

        self.resize(130, 130)
        self.move(500, 500)
        self.show()

    def init_window(self):
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool)
        self.setAttribute(Qt.WA_TranslucentBackground)  # 设置背景透明
        self.setAttribute(Qt.WA_NoSystemBackground, True)

    def update_pet_image(self):
        pixmap = QPixmap(self.pet_images[self.current_frame]) # QPixmap适合渲染静态图片
        self.pet_label.setPixmap(pixmap)
        self.pet_label.setScaledContents(True) # 确保图片根据 QLabel 的大小自动缩放
        self.pet_label.resize(130, 130)

    def refresh(self):
        # 这里面应该根据 pet_status 选择一个分支
        if self.pet_status == 0:
            self.current_frame = (self.current_frame + 1) % len(self.pet_images[:2])  # 仅行走帧
            self.move(self.x() - 4, self.y())
        else:
            self.current_frame = 2
        self.update_pet_image()
    
    def update_pet_status(self):
        self.pet_status = random.choice([0, 1])

    # 实现鼠标拖拽
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drag_position = event.globalPos() - self.frameGeometry().topLeft()
    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            self.move(event.globalPos() - self.drag_position)

    # 创建系统托盘及菜单
    def create_tray_icon(self):
        tray_icon = QSystemTrayIcon(self)
        tray_icon.setIcon(QIcon("resources/sleep.png"))

        menu = QMenu()

        show_action = QAction("显示宠物", self)
        show_action.triggered.connect(self.show)

        hide_action = QAction("隐藏宠物", self)
        hide_action.triggered.connect(self.hide)

        quit_action = QAction("退出", self)
        quit_action.triggered.connect(QApplication.quit)

        menu.addAction(show_action)
        menu.addAction(hide_action)
        menu.addSeparator()
        menu.addAction(quit_action)

        tray_icon.setContextMenu(menu)
        tray_icon.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    pet = Pet()
    sys.exit(app.exec_())
